<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>访问控制</title>
</head>
<body>
    
</body>
</html>
<script>
    //public 指的是不受保护的属性  在类的内部和外部都可以访问到
    // class User{
    //     _url = "houdurnen.com";
    //     constructor(name){
    //         this.name = name;
    //     }
    //     //使用这种方式的目的就是防止改变的数据 不合法
    //     set url(value){
    //         if(!/^https:\/\//i.test(value)){
    //             throw new Error("网址错误")
    //         }
    //         this._url = value;
    //     }
    //     get url(){
    //         return this._url;
    //     }
    // }
    // let hd = new User("后盾人");
    // hd.url = 'https://www.houdunren.com';
    // //不能让网址随便修改
    // console.log(hd.url);



    //命名保护
    //将属性定义为_开始，来告诉使用者这是一个私有属性
    //外部访问私有属性的时候  可以使用访问器getter

    // class Article{
    //     //这是一个私有属性  提醒外部不建议访问   但是依然是可以访问的
    //     //吸烟有害健康   但是还是可以抽的
    //     _host = "https://www.houdunren.com";

    //     //设置器
    //     set host(url){
    //         if(!/^https:\/\//i.test(url)){
    //             throw new Error('网址错误');
    //         }
    //         this._host = url;
    //     }

    //     //访问器
    //     get host(){
    //         return this._host;
    //     }

    //     lists(){
    //         return `${this._host}/article`;
    //     }
    // }

    // let article = new Article();
    // // article.host = 'https://www.houdunwang.com';
    // // console.log(article.host);
    // console.log(article.lists());
    // article.host = 'https://www.houdunwang.com';
    // console.log(article.lists());



    //继承时是可以使用的
    //父类
    // class Common{
    //     _host = "https://houdunren.com";
    //     set host(url){
    //         if(!/^https:\/\//i.test(url)){
    //             throw new Error("网址错误");
    //         }
    //         this._host = url;
    //     }
    // }

    // //子类
    // class Article extends Common{
    //     lists(){
    //         return `${this._host}/article`;
    //     }
    // }

    // let article = new Article();
    // //可以直接读取   也可以使用父类的设置属性方法
    // // article.host = 'https://www.houdunwang.com';
    // // console.log(article.lists());

    // console.log(article);

    //使用Symbol定义私有属性访问，就是在外部无法通过查看对象结构获取属性
    // const protecteds = Symbol();

    // class Common{
    //     constructor(){
    //         //属性初始化
    //         this[protecteds] = {};
    //         this[protecteds].host = "https://houdunren.com";
    //     }
    //     //设置host
    //     set host(url){
    //         if(!/^https?:/i.test(url)){
    //             throw new Error("非正常网址");
    //         }
    //         this[protecteds].host = url;
    //     }

    //     //获取host
    //     get host(){
    //         return this[protecteds].host;
    //     }
    // }

    // class User extends Common{
    //     constructor(name){
    //         //直接不能使用，因为虽然继承了；但是并没有使用父类的构造函数  所有初始化的数据不存在
    //         super();
    //         this[protecteds].name = name;
    //     }
    //     //想要读取name  必须使用访问器才能读取
    //     get name(){
    //         return this[protecteds].name;
    //     }
    // }

    // let hd = new User('后盾人');
    // console.log(hd);

    

    /*
    //WeakMap
    //WeakMap是一组键值对的集

    const _host = new WeakMap();
    class Common{
        constructor(){
            _host.set(this,"https://houdunren.com");
        }
        set host(url){
            if(!/^https:\/\//i.test(url)){
                throw new Error("网址错误");
            }
            _host.set(this,url);
        }
    }

    //自己的类必须要实例化 也就是必须要有构造函数 因为继承不会继承父类的构造方法
    class Article extends Common{
        constructor(){
            super();
        }
        lists(){
            return `${_host.get(this)}/article`;
        }
    }

    let article = new Article();
    console.log(article.lists());
    article.host = 'https://www.houunwang.com';
    console.log(article.lists());
    */



    //也可以统一定制私有属性
    //WeakMap 中的元素不会重复   而且对应的有   set  和  get  属性   里面可以放任意类型的值 
    //读取的时候 也必须使用这个WeakMap属性来读取   
    const protecteds = new WeakMap();
    class Common{
        constructor(){
            protecteds.set(this,{
                host : "https://houdunren.com",
                port : "80"
            });
        }
        set host(url){
            if(!/^https:\/\//i.test(url)){
                throw new Error("网址错误");
            }
            //后面的会把前面的替换
            protecteds.set(this,{...protecteds.get(this),host:url});
        }

        get host(){
            return protecteds.get(this).host;
        }
    }

    class Article extends Common{
        constructor(){
            super();
        }
        lists(){
            return `${protecteds.get(this).host}/article`;
        }
    }

    let article = new Article();
    console.log(article.lists());
    article.host = 'https://hdcms.com';
    console.log(article.host);









</script>